iT邦幫忙

2026 iThome 鐵人賽

DAY 25
0
Software Development

30天刷完leetcoode75系列 第 25 篇

C++ 演算法練習 Day25|2336, 700 題解與思路分享

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20261009/20184265FiBpuuUkV0.png

題目解析:在一棵二元搜尋樹 (BST) 中,找出節點數值等於目標值的節點,並回傳以該節點為根的整棵子樹。如果找不到就回傳 null
解題思路:利用二元搜尋樹「左小右大」的特性來找。丟進迴圈跑,只要目前節點不是空的,且數值還沒對上目標值就繼續找。如果目標值比目前節點的值還要小,就往左邊的子樹找;反之如果比較大,就往右邊的子樹找。迴圈結束時,代表要嘛找到了,要嘛走到盡頭變成空值,直接回傳目前的節點即可

class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        while (root && root->val != val) {
            if (val < root->val)
                root = root->left;
            else
                root = root->right;
        }
        return root;
    }
};

https://ithelp.ithome.com.tw/upload/images/20261009/201842658yf9KmaUvu.png

題目解析:實作一個無限大集合的類別,裡面預設包含所有正整數 (1, 2, 3...)。需要支援兩個功能:一個是移除並回傳集合中最小的數字,另一個是把數字加回集合中(如果該數字原本不在裡面的話)。
解題思路:不需要真的建一個無限大的陣列。設一個變數 cur 記錄目前無限序列發派到哪個數字(初始為 1),再設一個集合 v 用來裝「被加回來的數字」。
popSmallest: 因為被加回來的數字一定比 cur 小,所以先檢查集合 v 是不是空的。如果有東西,就把集合裡最小的(也就是第一個)數字拔出來回傳;如果集合是空的,就直接回傳 cur,並把 cur 加 1 推進到下一個數字。
addBack: 傳入的數字必須小於 cur 才有意義(因為大於等於 cur 的數字本來就還在無限序列裡,還沒被拿走)。如果小於 cur,就把它塞進集合 v 裡面,集合的特性會自動幫我們過濾掉重複加入的情況。

class SmallestInfiniteSet {
private:
    int cur;
    set<int> v;

public:
    SmallestInfiniteSet() {
        cur = 1;
    }

    int popSmallest() {
        if (!v.empty()) {
            int x = *v.begin();
            v.erase(v.begin());
            return x;
        }
        return cur++;
    }

    void addBack(int num) {
        if (num < cur) {
            v.insert(num);
        }
    }
};

上一篇
C++ 演算法練習 Day24|1161, 236, 199 題解與思路分享
下一篇
C++ 演算法練習 Day26|2300, 72 題解與思路分享
系列文
30天刷完leetcoode75 共 26 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言